__stdcall __cdecl 和 __thiscall的区别?

高级语言被编译成机器代码时,有一个问题必须解决: CPU 没有办法知道一个函数需要调用多少个参数,即计算机不知道怎么给函数传参。传参工作必须由函数调用或者函数本身来协调。为此,计算机提供一种被称为栈的数据结构来支持参数传递。
需考虑

  1. 当参数多于一个时,按照什么顺序入栈。
  2. 函数调用后,由谁来恢复栈。
    函数返回值放什么地方。

常用的调用规范有: stdcall , cdecl, thiscall

__stdcall:

  1. 参数由右向左顺序入栈
  2. 函数自身修改堆栈
  3. 函数名自动加下划线,后面紧跟@+参数大小(如: int func(int a, int b) => _func@8

__cdecl:

C语言函数的缺省调用约定

  1. 参数由右向左顺序入栈
  2. 调用者修改堆栈,因此 C语言支持不固定个数的参数。
  3. 函数名前自动加下划线

__thiscall:

唯一一个不能指明的函数修饰,C++ 类成员函数的缺省调用约定

  1. 参数由右向左入栈
  2. 若参数个数确定,则 this 指针通过 ecx 传给被调用者,否则 this 在所有参数压入栈后压栈。
  3. 参数确定时,函数自己清理堆栈。否则调用者清理堆栈。